<?php
/**
* 微框架入口，我们将系统抛出的部分异常转换为用户异常错误
* 这样可在生产环境中使用error_reporting控制调试信息的输出
* 注意：前、后台页面结构一致，但两者的系统路径常量的值不同,
* 会话的前缀（Session）可能不一样.
*/

// 屏蔽废弃或提醒类错误消息
error_reporting(0);

// 拒绝非法文件引用
define('IN_MY_PHP', true);

// 设置Session前缀来区别不同的应用
defined('APPID') || define('APPID', 'demo');

// 一些用到的常量
define('NUM_PRC', 1.0E-6);
defined('CRLF') || define('CRLF', "\r\n");
defined('DS') || define('DS', DIRECTORY_SEPARATOR);
// ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
// -- 根据文件的相对位置计算出来项目根目录
define('PROJECT_PATH', rtrim(dirname(dirname(__FILE__)), DS) . DS);
define('LIB_PATH', rtrim(dirname(__FILE__), DS) . DS);
// -- 也可以写死成下面的固定形式
// define('PROJECT_PATH', 'path-to-project' . DS);
// define('LIB_PATH', PROJECT_PATH . 'path-to-lib' . DS);
// ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

if (PHP_SAPI != 'cli') {
	// web-protocol :// hostname[:port] / path / [;parameters][?query]#fragment
	define('PROTOCOL', ($_SERVER['HTTPS'] == 'off' || $_SERVER['HTTPS'] == '') ? 'http://' : 'https://');
	// 协议、域名及端口：(http://xxx.xx[:80])
	define('WEBHOST', PROTOCOL.$_SERVER['HTTP_HOST']);
	// 服务器根目录（文件路径）
	define('DOCPATH', rtrim(preg_replace('/[\\\\\\/]/', DS, $_SERVER['DOCUMENT_ROOT']), DS).DS);
	// 脚本的相对路径和根路径的差值
	define('CRPATH', str_replace(DS, '/', str_replace(PROJECT_PATH, DS, rtrim(getcwd(), DS).DS)));
	// URL的根路径 eg:/xx/.../xx/；和服务器根目录相对应
	define('WEBPATH', str_replace(CRPATH, '/', str_replace(DS, '/', rtrim(dirname($_SERVER['SCRIPT_NAME']), DS).DS)));
	// 带协议和域名及端口的项目url前缀，用于兼容linux的路径
	define('PROJECT_URL', WEBHOST.WEBPATH);
	define('UPLOAD_URL', PROJECT_URL.'uploads/');//UPLOAD URL路径
	define('PLUGIN_URL', PROJECT_URL.'plugins/');//plugins URL路径
}


define('VENDOR_PATH', PROJECT_PATH.'vendor'.DS);//VENDOR文件路径
define('UPLOAD_PATH', PROJECT_PATH.'uploads'.DS);//UPLOAD 文件路径

define('ERROR_FILE', PROJECT_PATH.'#!dev'.DS.'error.log'); //异常错误
define('ERROR_ARC_FILE', PROJECT_PATH.'#!dev'.DS.'error_archive.log'); //异常错误归档


// 配置分页信息
define('PAGE_ROW_COUNT', 20);
// MySQL配置信息
define('MySQL_DB_HOST', '127.0.0.1');
define('MySQL_DB_NAME', 'rzyx');
define('MySQL_DB_PORT', 3306);
define('MySQL_DB_USER', 'root');
define('MySQL_DB_PWD', 'xxxx');

define('MSSQL_DB_HOST', '10.4.0.185');
define('MSSQL_DB_NAME', 'xxxx');
define('MSSQL_DB_PORT', 1433);
define('MSSQL_DB_USER', 'xxx');
define('MSSQL_DB_PWD', 'xxx');

// 设置时区：东八区
date_default_timezone_set('PRC');

// 页面可以在相同域名页面的 frame 中展示
// header('X-Frame-Options:SAMEORIGIN');
include_once LIB_PATH . 'Master.class.php';

// 所有本地请求视为调试，输出错误原因，禁止缓存
if (Master::singleton()->isLocalRequest() === true) {
	ini_set("display_errors", "On");
	error_reporting(E_ALL & ~ E_DEPRECATED & ~ E_NOTICE);
	header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');
	header('Cache-Control: no-store, no-cache, must-revalidate');
}

// 该函数将加载器放入队列中，按先后顺序逐个执行，直到找到类文件为止
// 故不用担心它和 Composer的加载机制相互冲突
function spl_autoload_handler_0fjdk3s2a ($class){
	// 仅自动加载LIB_PATH下的class文件
	if(file_exists(LIB_PATH . $class . '.class.php')){
		Master::singleton()->loadClass($class, false);
	}
}
spl_autoload_register('spl_autoload_handler_0fjdk3s2a');

// 如果在项目中存在vendor/autoload.php文件(含有Composer)，则加载它
if (version_compare(PHP_VERSION, '5.3.2') >= 0) {
	$_composer_auto_loader_file_0fjdk3s2a = VENDOR_PATH . 'autoload.php';
	if(file_exists($_composer_auto_loader_file_0fjdk3s2a)){
		include_once $_composer_auto_loader_file_0fjdk3s2a;
	}
}

// 如果以'_token_'关键字开头，则进行表单token验证，
// 将验证代码封装在函数中防止污染全局变量
// 验证token的结果会临时保存，方便手动查看
function form_token_auto_verify_0fjdk3s2a (){
	if($_SERVER['REQUEST_METHOD'] == 'POST' && is_array($_POST)){
		foreach($_POST as $token_key => &$token_str){
			if(is_string($token_str) && substr($token_key, 0, 5) == '_ftk_'){
				$app = Master::singleton();
				if(strlen($token_str) > 256 || !$app['Session']->verifyToken($token_key, $token_str)){
					$app['Utility']->jsAlert('令牌验证错误，请重新提交表单！', -1);
				}
			}
		}
	}
}

// 立即启用表单token自动验证
form_token_auto_verify_0fjdk3s2a();


// 锁定系统仅对管理员放行
function access_allowed_only_admin_0fjdk3s2a(){
	$app = Master::singleton();
	$login_uid = $app['Session']->get('uid');
	$isadmin = $app['Session']->get('admin');
	if($isadmin != 1 && $login_uid != null){
		header("Content-type:text/html;charset=utf-8");
		exit('系统暂时被管理员锁定，请稍后再试...');
	}
}
// access_allowed_only_admin_0fjdk3s2a();